GitHub Actions, JIRA API, Confluence API를 활용하여 개발 프로세스를 전면 자동화한 경험을 공유합니다. PR 자동 할당, JIRA 티켓 상태 자동 업데이트, 데일리 리포트 자동 생성으로 개발 생산성을 크게 향상시켰습니다.
📊 프로젝트 개요
목표
- PR 처리 시간 50% 단축
- 개발 프로세스 자동화 구현
- JIRA 티켓과 GitHub PR 연동
- 데일리 업무 리포트 자동 생성
핵심 성과
- ✅ PR 기본 정보 자동화 (어싸이니, 리뷰어, 라벨)
- ✅ JIRA 티켓 상태 자동 업데이트 (진행중 → 해결)
- ✅ OSS PR 연동 시 티켓 상태 자동 변경
- ✅ 데일리 리포트 자동 생성 (주간보고, 배포 현황, 티켓 브리핑, 코드리뷰)
- ✅ 개발 시간 절약 및 프로세스 일관성 확보
🔴 문제 상황
1. 수동 작업의 반복성
문제:
- PR 생성 시마다 어싸이니, 리뷰어, 라벨을 수동으로 설정해야 함
- JIRA 티켓 상태를 수동으로 업데이트해야 함
- 매일 반복되는 업무 정보 수집 작업 (주간보고, 배포 현황, 티켓 상태 등)
영향:
- 개발 시간 낭비
- 실수로 인한 누락 가능성
- 일관성 없는 프로세스
2. PR과 JIRA 티켓 연동 부재
문제:
- PR이 생성되어도 JIRA 티켓 상태가 자동으로 변경되지 않음
- PR이 머지되어도 티켓 상태가 자동으로 업데이트되지 않음
- 티켓 상태를 수동으로 확인하고 업데이트해야 함
영향:
- 프로젝트 진행 상황 파악 어려움
- 티켓 상태와 실제 진행 상황 불일치
3. 업무 정보 수집의 비효율성
문제:
- 매일 주간보고, 배포 현황, 티켓 상태를 수동으로 확인해야 함
- 여러 시스템(Confluence, JIRA, GitHub)을 오가며 정보 수집
- 정보가 분산되어 있어 한눈에 파악하기 어려움
영향:
- 업무 시작 전 정보 수집에 시간 소요
- 중요한 정보 누락 가능성
✅ 해결 방법
1. PR 자동화 시스템
1.1 PR 기본 정보 자동화
구현 내용:
- PR 생성 시 자동으로 어싸이니, 리뷰어, 라벨 할당
- 커밋명에서 티켓 키 추출
- 티켓 정보를 기반으로 자동 설정
효과:
- ✅ PR 생성 시 자동으로 기본 정보 설정
- ✅ 티켓 정보 기반 일관된 설정
- ✅ 수동 작업 시간 절약
2. JIRA-OSS 연동 시스템
2.1 JIRA 티켓 상태 자동 업데이트
구현 내용:
- 브랜치 푸시 시 티켓 상태를 "진행중"으로 자동 변경
- PR 생성 시 티켓 상태를 "리뷰중"으로 자동 변경
- PR 머지 시 티켓 상태를 "컨펌"으로 자동 변경
- 배포 시 티켓 상태를 "완료"으로 자동 변경
- 닫힘 상태 티켓 변경 방지 로직
효과:
- ✅ 브랜치 푸시 시 자동으로 티켓 상태 "진행중"으로 변경
- ✅ PR 생성 시 자동으로 티켓 상태 "리뷰중"으로 변경
- ✅ PR 머지 시 자동으로 티켓 상태 "컨펌"으로 변경
- ✅ 배포 시 자동으로 티켓 상태 "완료"로 변경
- ✅ 닫힘 상태 티켓 변경 방지로 데이터 무결성 보장
3. 대시보드 시스템 구축
3.1 데일리 리포트 자동 생성
구현 내용:
- 매일 반복되는 업무 정보를 자동으로 수집하여 Obsidian 마크다운 파일 생성
- Confluence, JIRA, GitHub API를 직접 호출하여 데이터 수집
- 순수 JavaScript로 구현하여 의존성 없음
주요 기능:
1. 주간보고 데이터 수집
// 위키 페이지 수집
async function getWeeklyReportPages() {
const pages = await confluenceAPI.getChildrenPages(PARENT_PAGE_ID)
// 필터링: 이윤희 관련 + 오늘 이후 날짜
const filteredPages = pages.filter((page) => {
const hasUserName = page.title.includes('이윤희')
const hasFutureDate = extractDate(page.title) >= today
return hasUserName && hasFutureDate
})
return filteredPages
}
// Jira 티켓 수집
async function getWeeklyReportTickets() {
const jql = `assignee = "KR22913" AND updated >= "지난목요일" AND updated <= "오늘 23:59"`
const tickets = await jiraAPI.searchIssues(jql)
return tickets.sort((a, b) => new Date(b.updated) - new Date(a.updated))
}
2. 배포 현황 데이터 수집
// 정기배포 티켓 조회
async function getRegularDeploymentTickets(deploymentDate) {
const dateStr = formatDate(deploymentDate, 'yyMMdd') // 예: 251112
const fixVersion = `RB_${dateStr}_쇼핑버티컬웹개발`
const jql = `assignee = KR22913 AND fixVersion = ${fixVersion}`
return await jiraAPI.searchIssues(jql)
}
// 비정기배포 티켓 조회
async function getIrregularDeploymentTickets(deploymentDate) {
const dateStr = formatDate(deploymentDate, 'yyMMdd')
const fixVersion = `HF_${dateStr}_쇼핑버티컬웹개발`
const jql = `assignee = KR22913 AND fixVersion = ${fixVersion}`
return await jiraAPI.searchIssues(jql)
}
3. 지라 티켓 브리핑
// 오픈 스프린트 티켓 조회
async function getSprintTickets() {
const jql = `sprint in openSprints() AND assignee = "KR22913" ORDER BY status ASC, updated DESC`
const tickets = await jiraAPI.searchIssues(jql)
// 상태별 그룹화
const grouped = groupByStatus(tickets, [
'리뷰 중',
'진행 중',
'보류',
'할 일',
'등록',
'해결',
'닫힘',
])
return grouped
}
4. 코드리뷰 알림
// 내가 만든 PR
async function getMyPRs() {
const query = `author:${username} is:pr is:open`
return await githubAPI.searchPullRequests(query)
}
// 내가 리뷰어인 PR
async function getPRsWhereIAmReviewer() {
const queries = [
`review-requested:${username} is:pr is:open`,
`reviewed-by:${username} is:pr is:open`,
]
// 팀 리뷰 요청 포함
const teams = await githubAPI.getUserTeams(username)
teams.forEach((team) => {
queries.push(`review-requested:${team} is:pr is:open`)
})
return await Promise.all(
queries.map((query) => githubAPI.searchPullRequests(query))
).then((results) => results.flat())
}
효과:
- ✅ 매일 반복되는 정보 수집 작업 자동화
- ✅ 여러 시스템을 한눈에 파악 가능
- ✅ 중요한 정보 누락 방지
- ✅ 업무 시작 전 빠른 브리핑
🏗️ 전체 아키텍처
자동화 흐름
브랜치 푸시
↓
JIRA 상태 자동 업데이트 (진행중)
↓
PR 생성
↓
GitHub Actions 트리거
↓
┌─────────────────┬──────────────────────────┬─────────────────┐
│ PR 기본 정보 │ JIRA 상태 자동 업데이트 │ 리뷰어 할당 │
│ 자동 설정 │ (리뷰중) │ │
└─────────────────┴──────────────────────────┴─────────────────┘
↓
PR 머지
↓
JIRA 상태 자동 업데이트 (컨펌)
↓
배포
↓
JIRA 상태 자동 업데이트 (완료)
↓
QA 확인
↓
JIRA 상태 업데이트 (닫힘)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
↓
매일 자동 실행 (데일리 리포트)
↓
Confluence API → 주간보고 데이터
JIRA API → 티켓 브리핑, 배포 현황
GitHub API → 코드리뷰 알림
↓
Obsidian 마크다운 파일 생성
📈 개선 효과
정량적 성과
| 항목 | Before | After | 개선 |
|---|---|---|---|
| PR 처리 시간 | 수동 설정 필요 | 자동화 | 50% 단축 |
| 티켓 상태 업데이트 | 수동 | 자동 | 100% 자동화 |
| 데일리 리포트 생성 | 수동 수집 (30분) | 자동 생성 (1분) | 97% 시간 절약 |
| 정보 수집 시간 | 30분/일 | 1분/일 | 97% 감소 |
정성적 성과
- ✅ 개발 프로세스 일관성 확보
- ✅ 실수로 인한 누락 방지
- ✅ 개발자 생산성 향상
- ✅ 프로젝트 진행 상황 가시성 향상
- ✅ 업무 시작 전 빠른 브리핑 가능
💡 핵심 교훈
1. 자동화는 점진적으로 확장해야 함
처음에는 기본적인 기능부터 시작하고, 점진적으로 고도화하는 것이 좋습니다. 한 번에 모든 것을 자동화하려고 하면 복잡도가 높아질 수 있습니다.
2. 에러 처리와 Fallback 로직이 중요함
JIRA API 호출 실패, 티켓 키 추출 실패 등 다양한 예외 상황을 고려해야 합니다. 자동화가 실패해도 수동으로 처리할 수 있는 Fallback 로직이 필요합니다.
3. 팀의 워크플로우를 이해해야 함
각 팀마다 다른 워크플로우가 있으므로, 팀의 실제 프로세스를 이해하고 그에 맞게 자동화를 설계해야 합니다.
4. 보안을 고려해야 함
JIRA API 토큰, GitHub 토큰 등 민감한 정보는 GitHub Secrets로 관리하고, 최소 권한 원칙을 적용해야 합니다.
5. 모니터링과 로깅이 필요함
자동화가 제대로 동작하는지 모니터링하고, 실패 시 로그를 확인할 수 있어야 합니다.
6. Rate Limit 처리
API 호출 시 Rate Limit을 고려하여 Retry-After 헤더 기반 자동 재시도 로직을 구현해야 합니다.
🎯 결론
개발 프로세스 자동화 구축을 통해 다음과 같은 성과를 달성했습니다:
- ✅ PR 처리 시간 50% 단축: 자동화로 수동 작업 시간 절약
- ✅ JIRA 티켓 상태 자동 업데이트: PR과 티켓 연동으로 프로젝트 진행 상황 가시성 향상
- ✅ 데일리 리포트 자동 생성: 매일 반복되는 정보 수집 작업 자동화로 97% 시간 절약
- ✅ 일관된 프로세스: 자동화로 일관된 워크플로우 확보
- ✅ 개발자 생산성 향상: 반복 작업 자동화로 개발에 집중 가능
이번 작업을 통해 개발 프로세스 자동화의 중요성을 깨달았고, GitHub Actions, JIRA API, Confluence API 연동 경험을 쌓을 수 있었습니다. 특히 데일리 리포트 자동화는 개인 생산성 향상에 큰 도움이 되었습니다.
